package com.ruoyi.web.controller.yf;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.responseBodyJson.JSON;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysDept;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.yf.domain.Report;
import com.ruoyi.yf.domain.YfHospitalStatus;
import com.ruoyi.yf.service.IReportservice;
import com.ruoyi.yf.service.IYfStorageWarningService;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * Controller
 *
 * @author XiaoYi...
 * @date 2020-03-31
 * ead0c95f-431c-4b2e-b6d8-f1a79d57ad04
 */
@Controller
@RequestMapping("/yf/reports")
public class YfReportsController extends BaseController {
    private String prefix = "yf/analysis";

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Autowired
    private IReportservice yfReportsService;
    @Autowired
    private ISysDeptService sysDeptService;
    @Autowired
    private IYfStorageWarningService yfStorageWarningService;


    //todo 条码查询
//    78e4f4d6-7fe0-4d51-b248-201cc6568196
    @RequestMapping("/selectTagUpdateDescLimit")
    @ResponseBody
    @JSON(type = Report.class, include = "codeId,update,weight,type,status,hospitalName,deptName,name")
    public TableDataInfo selectTagUpdateDescLimit() {
        List<Report> list = yfReportsService.selectTagUpdateDescLimit(ShiroUtils.getSysUser().getDeptId(), 10);
        return getDataTable(list);
    }
    //todo 医废处置公司条码查询首页显示10条记录
//    78e4f4d6-7fe0-4d51-b248-201cc6568196
    @RequestMapping("/selectTagUpdateDescLimit1")
    @ResponseBody
    @JSON(type = Report.class, include = "codeId,update,weight,type,status,hospitalName,deptName,name")
    public TableDataInfo selectTagUpdateDescLimit1() {
        List<Report> list = yfReportsService.selectTagUpdateDescLimit(ShiroUtils.getSysUser().getDeptId(), 10);
        return getDataTable(list);
    }


    //todo 统计分析 ---------------------------
//    11271e4c-2f56-481c-b558-dbaf0f564d58
    @PostMapping("/priview")
    @ResponseBody
    @JSON(type = Report.class, include = "sum,year_sum,month_sum,week_sum,day_sum,store_sum,bag,year_bag,month_bag,week_bag,day_bag,store_bag")
    public AjaxResult previewMain() {
        return toAjaxFull(yfReportsService.previewMain(ShiroUtils.getSysUser().getDeptId()));
    }
    //todo 处置公司统计分析 ---------------------------
//    11271e4c-2f56-481c-b558-dbaf0f564d58
    @PostMapping("/priview1")
    @ResponseBody
    @JSON(type = Report.class, include = "sum,year_sum,month_sum,week_sum,day_sum,store_sum,bag,year_bag,month_bag,week_bag,day_bag,store_bag")
    public AjaxResult previewMain1() {
        return toAjaxFull(yfReportsService.previewComponyMain(ShiroUtils.getSysUser().getDeptId()));
    }
    // 大屏医废类型统计
    //3fa7b9f2-c796-40c2-982e-26da91a05ac2
    @PostMapping("/nowTypeSS")
    @JSON(type = Report.class, include = "pathology_w,pathology_bag,infection_w,infection_bag,drug_w,drug_bag,damage_w,damage_bag,chemical_w,chemical_bag,tp_w,tp_bag")
    public AjaxResult brashTypeNowSumStatistical() {
        return toAjaxFull(yfReportsService.brashTypeNowSumStatistical(ShiroUtils.getSysUser().getDeptId()));
    }

    // 获取今年医废总产量、总袋数
//    04ec2f7b-3d1e-41f5-86bf-8f31dac8139e
    @PostMapping("/getYearYFTotalWeightAndBags")
    @JSON(type = Report.class, include = "yearTotalBags,yearTotalWeight")
    public AjaxResult getYFTotalWeightAndBags() {
        return toAjaxFull(yfReportsService.getYearYFTotalWeightAndBags(ShiroUtils.getSysUser().getDeptId()));
    }

    //获取医院列表统计量及坐标
//    22d94dd0-ffb4-4487-acb0-81ca8b9e6ff3
    @PostMapping("/getHospitalWeightBagPoint")
    @JSON(type = Report.class, include = "hospital_name,sum_bag,sum_value,staging_bag,staging_value,day_sum_bag,day_sum_value,day_staging_bag,day_staging_value,point")
    public TableDataInfo getHospitalWeightBagPoint() {
        return getDataTable(yfReportsService.getHospitalWeightBagPoint(ShiroUtils.getSysUser().getDeptId()));
    }


    //todo 统计图形 -------------------------

    /**
     * 医疗机构数量统计图
     *eb2d5df8-76e5-4463-876d-07c76a918da4
     */
    @GetMapping("/echarets/barDeptNum")
    public String barDeptNum() {
        return prefix + "/echarets/bar_deptNum";
    }

    /**
     * 医疗机构异常数量统计图
     *ce1f1a04-a38e-4707-8752-0955f02cfcfe
     */
    @GetMapping("/echarets/exceptionDeptNum")
    public String exceptionDeptNum() {
        return prefix + "/echarets/exception_deptNum";
    }

    /**
     * 积存量变化趋势图
     *
     * @return java.lang.String
     * @author XiaoYi...
     * @date 2020-04-29 18:02
     * 1808a60d-1ea9-443c-ae4c-aff94b1273eb
     */
    @GetMapping("/echarets/storageAxis")
    public String storage_axis() {
        return prefix + "/echarets/storage_axis";
    }

    /**
     * 历史积存量变化趋势图
     *b61331f0-8844-41e3-a9d7-e470dd27df84
     */
    @GetMapping("/echarets/storageHistoryAxis")
    public String storage_history_axis() {
        return prefix + "/echarets/storage_history_axis";
    }


    /**
     * 折线统计图 -- 积存量变化趋势图
     *
     * @return
     * e10f9e58-5993-44cf-90f7-0c951c0b67fc
     */
    @PostMapping("/echarets/storageAxisList")
    @JSON(type = Report.class, include = "statisticsDate,value")
    public TableDataInfo storageAxisList() {
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.storage_axis(deptId);
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println( "   -----   " + list.get(i).getStatisticsDate() + "    " + list.get(i).getValue() );
//        }
        return getDataTable(list);
    }


    /**
     * 折线统计图 -- 历史积存量变化趋势图
     *
     * @return
     * 64a9b281-fd62-42b5-8eab-bbfded75cbf3
     */
    @PostMapping("/echarets/storageHistoryAxisList")
    @JSON(type = Report.class, include = "statisticsDate2,value")
    public TableDataInfo storageHistoryAxisList(String dateType, String yearMonth, String year, Long countyId) {

        // System.out.println( "    查询日期类型： " + dateType + "   年月： " + yearMonth + "    月份： " + year );
        // System.out.println( "    ==========   " + countyId );
        if( StringUtils.isEmpty(dateType)|| ( dateType.equals("2") && StringUtils.isEmpty(yearMonth) )
                || ( dateType.equals("3") && StringUtils.isEmpty(year) ) ){
            return getDataTable(new ArrayList<Report>());
        }
        // 检测年月是否正确
        try{
            if( dateType.equals("2") && !StringUtils.isEmpty(yearMonth) ){
                new SimpleDateFormat("yyyy-MM").parse(yearMonth);
            }
            if( dateType.equals("3") && !StringUtils.isEmpty(year) ){
                new SimpleDateFormat("yyyy").parse(year);
            }
        }catch(Exception e){
            return getDataTable(new ArrayList<Report>());
        }

        String deptType = ShiroUtils.getSysUser().getDept().getDeptType();
        Integer deptDistrict = ShiroUtils.getSysUser().getDept().getDistrictsId();
        // 超级管理员： user_id：1   dept_id:100    100:医废管理平台    机构类型：0
        // 机构类型: 110 省级卫健委    120 市级卫健委    130 区县级卫健局   220省级医院  270市级   290区县级
        // System.out.println( "  ---------- 机构类型：  " +  deptType );
        // System.out.println( "  ---------- 机构地区：  " +  deptDistrict );

        String flag = "1";      // 1 时admin登录，全部查询，不过滤数据
        String districtId = null;
        if( deptType.equals("0") ){   // admin或平台高级管理员及以上  --  取统计表全部数据
            flag = "0";
        }else if( deptType.equals("110") ){     // 省级卫健委 -- 取地区前2位
            districtId = (deptDistrict + "").substring(0,2);
        }else if( deptType.equals("120") ){     // 市级卫健委 -- 取地区前4位
            districtId = (deptDistrict + "").substring(0,4);
        }else if( deptType.equals("130") ){     // 区县级卫健局 -- 取地区6位
            return getDataTable(new ArrayList<Report>());
        }else{
            return getDataTable(new ArrayList<Report>());
        }

        // 历史积存量趋查询
        List<Report> list = null;
        if( dateType.equals("1") ){             // 历史积存量趋查询（近一周）
            list = yfReportsService.storageHistoryAxisListByLatestWeek(countyId,flag,districtId == null? null:Long.parseLong(districtId) );
        }else if( dateType.equals("2") ){       // 历史积存量趋查询（按月查询：yyyy-MM ）
            // sql需要传入查询月份的开始日期、结束日期
            Calendar c = Calendar.getInstance();
            c.set(Integer.parseInt( yearMonth.substring(0,4) ), Integer.parseInt( yearMonth.substring(5,7) ), 0);
            int maxDays = c.get(Calendar.DAY_OF_MONTH);
            list = yfReportsService.storageHistoryAxisListByYearMonth(countyId,flag, districtId == null? null:Long.parseLong(districtId),
                    yearMonth + "-01", yearMonth + "-" + maxDays );
        }else if( dateType.equals("3") ){       // 历史积存量趋查询（按年查询：yyyy）
            list = yfReportsService.storageHistoryAxisListByYear(countyId,flag, districtId == null? null:Long.parseLong(districtId),
                    year + "-01-01", year + "-12-31");
        }else{
            return getDataTable(list);
        }

//        for (int i = 0; i < list.size(); i++) {
//            System.out.println( "   -----   " + list.get(i).getStatisticsDate2() + "    " + list.get(i).getValue() );
//        }
        return getDataTable(list);
    }


    /**
     * 医院医废总产量统计排行
     *
     * @return
     * 17e34f23-0f78-4d0a-b79c-50e7755020f8
     */
    @PostMapping("/echarets/hospitalYFStatisticsList")
    @JSON(type = Report.class, include = "id,name,value")
    public TableDataInfo hospitalYFStatisticsList() {
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.hospitalYFStatisticsList(deptId);
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println( "   -----   " + list.get(i).getId() + "    " + list.get(i).getName() + "    " + list.get(i).getValue() );
//        }
        return getDataTable(list);
    }


//    /**
//     * 医疗机构异常数量统计 -- 大屏 -- 右三 -- 旧方式
//     */
//    @PostMapping("/echarets/hospitalExceptionNum")
//    @JSON(type = Report.class, include = "name,value")
//    public TableDataInfo hospitalExceptionNum() throws ParseException {
//        List<Report> zlist = new ArrayList<>();
//        // 用户所在的机构id
//        Long deptId = ShiroUtils.getSysUser().getDeptId();
//        // 权限内所有的医院、暂存点
//        List<YfHospitalStatus> list = yfStorageWarningService.hospitalStatusList(deptId, new YfHospitalStatus());
//        if (list == null || list.isEmpty()) {
//            Report report1 = new Report();
//            report1.setName("异常");
//            report1.setValue(0);
//            zlist.add(report1);
//            Report report2 = new Report();
//            report2.setName("正常");
//            report2.setValue(0);
//            zlist.add(report2);
//            return getDataTable(zlist);
//        }
//
//        // 用来装权限内所有医院id
//        HashSet<Long> allHosIdSet = new HashSet<>();
//        // 用来装有异常的医院id
//        HashSet<Long> exHosIdSet = new HashSet<>();
//
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        for (int i = 0; i < list.size(); i++) {
//            // 装权限内所有医院id
//            allHosIdSet.add(list.get(i).getHospitalId());
//
//            // 取预警值、暂存量
//            if (list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0) {     // 无预警值则不需要预警
//                if (list.get(i).getInStoreWeight() != null && list.get(i).getInStoreWeight() != 0) {     // 暂存量
//                    if (list.get(i).getInStoreWeight() > list.get(i).getMaxStore()) {   // 暂存量超过预警值预警
//                        exHosIdSet.add(list.get(i).getHospitalId());
//                    }
//                }
//            }
//
//            // 超过24小时无医废录入 ， 如果最后一次收集时间为空 ，则取暂存点的创建时间
//            // 第一种情况：从最后一次收集时间算起，超过24小时无医废录入，或暂存点未录入过医废，从暂存点创建时间算起24小时无医废录入
////            if( list.get(i).getLastCollDate() != null ){    // 最后一次收集时间距离现在超过24小时    暂时3天
////                if( new Date().getTime() - list.get(i).getLastCollDate().getTime() > 259200000L  ){
////                    exHosIdSet.add( list.get(i).getHospitalId() );
////                }
////            }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间距离现在超过24小时
////                if( new Date().getTime() - list.get(i).getStagingCreateTime().getTime() > 259200000L  ){
////                    exHosIdSet.add( list.get(i).getHospitalId() );
////                }
////            }
//
//            // 2020-8-5 修改 lxl  增加以下几行代码  ，从创建时间开始如果24小时未录入提醒预警
//            if (!StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
//                    && list.get(i).getOverdueNotinputSwitch().equals("0")) {   // 0 开启预警
//                long overdueTime = 3600000L * (list.get(i).getOverdueNotinputHours() + 24);
//                if( list.get(i).getLastCollDate() != null ){    // 最后一次收集时间距离现在超过24小时    暂时3天
//                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
//                    if((new Date().getTime() - sdf.parse(lastCollDate).getTime()) > overdueTime ){ // 最后一次收集时间超过设置的预警时间
//                        if( list.get(i).getLastNoCollDate()== null ||
//                                ( list.get(i).getLastNoCollDate()!= null
//                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
//                            exHosIdSet.add( list.get(i).getHospitalId() );
//                        }
//                    }
//                }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间距离现在超过24小时
//                    String stagingCreateTime = sdf.format(list.get(i).getStagingCreateTime());
//                    if ((new Date().getTime() - sdf.parse(stagingCreateTime).getTime()) > overdueTime ) {
//                        if( list.get(i).getLastNoCollDate()== null ||
//                                ( list.get(i).getLastNoCollDate()!= null
//                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
//                            exHosIdSet.add( list.get(i).getHospitalId() );
//                        }
//                    }
//                }
//            }
//            //   ============================    结束
//
//
//            // 第二种情况：未开启超期未录入的不预警；
//            // 开启的，从最后一次收集时间取到天算起，超过设置的超期未录入预警小时加24的报异常；暂存点未录入过医废不进行超期未录入预警
////            if (!StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
////                    && list.get(i).getOverdueNotinputSwitch().equals("0")) {   // 0 开启预警
////                if (list.get(i).getLastCollDate() != null) {    // 有最后一次收集时间才比较，没有收集不预警
////                    // 处理最后一次收集时间取到天转成long型
////                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
////                    if ((new Date().getTime() - sdf.parse(lastCollDate).getTime()) > (3600000L * (list.get(i).getOverdueNotinputHours() + 24))) {
////                        exHosIdSet.add(list.get(i).getHospitalId());
////                    }
////                }
////            }
//
//            // 收集医废24小时未入库
//            if (list.get(i).getNoInCodeIdCount() != null && list.get(i).getNoInCodeIdCount() > 0
//                    && list.get(i).getNoInBag() != null && list.get(i).getNoInBag() > 0) {
//                exHosIdSet.add(list.get(i).getHospitalId());
//            }
//            // 已入库医废超过48小时未出库
//            if (list.get(i).getNoOutCodeIdCount() != null && list.get(i).getNoOutCodeIdCount() > 0
//                    && list.get(i).getNoOutBag() != null && list.get(i).getNoOutBag() > 0) {
//                exHosIdSet.add(list.get(i).getHospitalId());
//            }
//        }
//
//        System.out.println(" 所有医院数量：  " + allHosIdSet.size() + "  异常医院数量： " + exHosIdSet.size()
//                + "  正常医院数量： " + (allHosIdSet.size() - exHosIdSet.size()));
//
//        // 查询当前用户所在机构下辖的医疗机构
////        deptId
//        // 用来装权限内所有医院id
////        HashSet<Long> allHosIdSet = new HashSet<>();
////        // 用来装有异常的医院id
////        HashSet<Long> exHosIdSet = new HashSet<>();
//
//        // 所有科室
//        int allks = 0,exceptks = 0;
//
//        for (Long hid:allHosIdSet) {
//            for (int i = 0; i < list.size() ; i++) {
//                if( hid.longValue() == list.get(i).getHospitalId().longValue() ){
//                    allks += list.get(i).getKsNum();
//                    break;
//                }
//            }
//        }
//        for (Long hid:exHosIdSet) {
//            for (int i = 0; i < list.size() ; i++) {
//                if( hid.longValue() == list.get(i).getHospitalId().longValue() ){
//                    exceptks += list.get(i).getKsNum();
//                    break;
//                }
//            }
//        }
//
//        Report report1 = new Report();
//        report1.setName("异常");
//        report1.setValue(exHosIdSet.size() + exceptks);
//        zlist.add(report1);
//        Report report2 = new Report();
//        report2.setName("正常");
//        report2.setValue(allHosIdSet.size() - exHosIdSet.size() + allks - exceptks );
//        zlist.add(report2);
//        return getDataTable(zlist);
//    }



    /**
     * 医疗机构异常数量统计 -- 大屏 -- 右三 -- 修改后
     * d9c6764c-1c76-4e53-8c39-c93fe9fa947f
     */
    @PostMapping("/echarets/hospitalExceptionNum")
    @JSON(type = Report.class, include = "name,value")
    public TableDataInfo hospitalExceptionNum() throws ParseException {
        List<Report> zlist = new ArrayList<>();
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        // 机构层级权限内各医院暂存点状况（科室类型为10的医废）
        List<YfHospitalStatus> list = yfStorageWarningService.deptHospitalInDeptWarnStatusList(deptId);

        // 机构层级权限内各医院的科室中的医疗机构状况（科室类型20到50，无需合并暂存点）
        List<YfHospitalStatus> list2 = yfStorageWarningService.deptHospitalInKSWarnStatusList(deptId);

        if ( (list == null || list.isEmpty()) && (list2 == null || list2.isEmpty()) )  {
            Report report1 = new Report();
            report1.setName("异常");
            report1.setValue(0);
            zlist.add(report1);
            Report report2 = new Report();
            report2.setName("正常");
            report2.setValue(0);
            zlist.add(report2);
            return getDataTable(zlist);
        }

        // 合并机构列表中的机构和科室中的机构后的list
        List<YfHospitalStatus> hoslist = new ArrayList<>();

        // 机构列表中的机构
        if( list != null && !list.isEmpty() ){
            // 遍历：set各暂存点预警的状态(有一种预警算作预警)    0 不预警    1 预警
            list = setWarn( list );
            // 分组，先把暂存点合并成医院（有一个暂存点预警则医院预警）
            list.stream()
                    .filter(s -> s.getHospitalId() != null)
                    .collect(Collectors.groupingBy(YfHospitalStatus::getHospitalId))        // getHospitalId 如果为空 报错
                    .forEach((k,v) -> {
                        Optional<YfHospitalStatus> hospital = v.stream().reduce((v1, v2) -> {  // 合并
                            v1.setIsHospitalWarn( v1.getIsHospitalWarn() >= v2.getIsHospitalWarn() ?
                                    v1.getIsHospitalWarn() : v2.getIsHospitalWarn()  );
                            return v1;
                        });
                        hoslist.add( hospital.orElse( new YfHospitalStatus() ) );
                    });
        }

        // 科室中的机构
        if( list2 != null && !list2.isEmpty() ){
            // 遍历：set各暂存点预警的状态    0 不预警    1 预警
            list2 = setWarn( list2 );
            hoslist.addAll(list2);
        }

        System.out.println( "  ---- 机构列表中暂存点数量：" + list.size() + " 科室中的机构数量： " + list2.size() + " 机构总数量： " + hoslist.size() );

        int exNum = 0;  // 异常机构数量
        for (int i = 0; i < hoslist.size(); i++) {
            if(hoslist.get(i).getIsHospitalWarn() == 1){
                exNum ++;
            }
        }

        Report report1 = new Report();
        report1.setName("异常");
        report1.setValue(exNum);
        zlist.add(report1);
        Report report2 = new Report();
        report2.setName("正常");
        report2.setValue(hoslist.size() - exNum );
        zlist.add(report2);
        return getDataTable(zlist);
    }



    // 遍历：set各暂存点预警的状态    0 不预警    1 预警
    private List<YfHospitalStatus> setWarn(List<YfHospitalStatus> list) throws ParseException {
        for (int i = 0; i < list.size(); i++) {
            // 取预警值、暂存量
            if( list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0
                    && list.get(i).getInStoreWeight() != null && list.get(i).getInStoreWeight() != 0 ){     // 无预警值、无暂存量 则不需要预警
                if( list.get(i).getInStoreWeight() > list.get(i).getMaxStore() ){   // 暂存量超过预警值预警
                    list.get(i).setIsHospitalWarn(1);
                }
            }
            // 从最后一次收集时间算起（最后一次收集时间、暂存点创建时间、今日无医废点击时间 -- 取最大值）,超过24小时或设置的小时无医废录入预警
            if( !StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
                    && list.get(i).getOverdueNotinputSwitch().equals("0") ){   // 0 开启预警
                long overdueTime = 3600000L * (list.get(i).getOverdueNotinputHours() + 24);
                if( list.get(i).getLastCollMaxDate() != null ){    // 有最后一次收集时间才比较，没有不预警
                    // 处理最后一次收集时间取到天转成long型
                    String lastCollMaxDate = sdf.format(list.get(i).getLastCollMaxDate());
                    if( (new Date().getTime() - sdf.parse(lastCollMaxDate).getTime()) > overdueTime ){ // 最后一次收集时间超过设置的预警时间
                        list.get(i).setIsHospitalWarn(1);
                    }
                }
            }
            // 已收集医废24小时未入库
            if( !StringUtils.isEmpty( list.get(i).getOverdueNoInYFTotal() ) ){
                list.get(i).setIsHospitalWarn(1);
            }
            // 已入库医废超过48小时未出库
            if( !StringUtils.isEmpty( list.get(i).getOverdueNoOutYFTotal() ) ){
                list.get(i).setIsHospitalWarn(1);
            }
        }

        return list;
    }



    /**
     * 异常类型占比分析图
     * cb19826c-9754-47b4-b3d7-90fc7043888e
     */
    @PostMapping("/echarets/exceptionTypePercent")
    @JSON(type = Report.class, include = "name,value")
    public TableDataInfo exceptionTypePercent() throws ParseException {
        List<Report> zlist = new ArrayList<>();
        // 用户所在的机构id
        Long deptId = ShiroUtils.getSysUser().getDeptId();
        // 权限内所有的医院、暂存点
        List<YfHospitalStatus> list = yfStorageWarningService.hospitalStatusList(deptId, new YfHospitalStatus());
        if (list == null || list.isEmpty()) {
            Report report1 = new Report();
            report1.setName("超出预警值");
            report1.setValue(0);
            zlist.add(report1);
            Report report2 = new Report();
            report2.setName("超期未录入");
            report2.setValue(0);
            zlist.add(report2);
            Report report3 = new Report();
            report3.setName("超期未出库");
            report3.setValue(0);
            zlist.add(report3);
            return getDataTable(zlist);
        }

        // 用来装超出预警值数量
        int exmaxstore = 0;
        // 用来装超期未录入数量
        int exin = 0;
        // 用来装超期未出库
        int exout = 0;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 0; i < list.size(); i++) {
            // 取预警值、暂存量
            if (list.get(i).getMaxStore() != null && list.get(i).getMaxStore() != 0) {     // 无预警值则不需要预警
                if (list.get(i).getInStoreWeight() != null && list.get(i).getInStoreWeight() != 0) {     // 暂存量
                    if (list.get(i).getInStoreWeight() > list.get(i).getMaxStore()) {   // 暂存量超过预警值预警
                        exmaxstore++;
                    }
                }
            }

            // 超过24小时无医废录入 ， 如果最后一次收集时间为空 ，则取暂存点的创建时间
            // 第一种情况：从最后一次收集时间算起，超过24小时无医废录入，或暂存点未录入过医废，从暂存点创建时间算起24小时无医废录入
//            if( list.get(i).getLastCollDate() != null ){    // 最后一次收集时间距离现在超过24小时
//                if( new Date().getTime() - list.get(i).getLastCollDate().getTime() > 259200000L  ){
//                    exin ++;
//                }
//            }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间距离现在超过24小时
//                if( new Date().getTime() - list.get(i).getStagingCreateTime().getTime() > 259200000L  ){
//                    exin ++;
//                }
//            }


            // 2020-8-5 修改 lxl  增加以下几行代码  ，暂存点创建后开始提醒未录入预警
            if (!StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
                    && list.get(i).getOverdueNotinputSwitch().equals("0")) {   // 0 开启预警
                long overdueTime = 3600000L * (list.get(i).getOverdueNotinputHours() + 24);
                if (list.get(i).getLastCollDate() != null) {    // 有最后一次收集时间才比较，没有收集不预警
                    // 处理最后一次收集时间取到天转成long型
                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
                    if ((new Date().getTime() - sdf.parse(lastCollDate).getTime()) > overdueTime ) {
                        if( list.get(i).getLastNoCollDate()== null ||
                                ( list.get(i).getLastNoCollDate()!= null
                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
                            exin++;
                        }
                    }
                }else if( list.get(i).getStagingCreateTime() != null ){     // 如果没有录入过医废，取暂存点创建时间距离现在超过24小时
                    // 处理最后一次收集时间取到天转成long型
                    String stagingCreateTime = sdf.format(list.get(i).getStagingCreateTime());
                    if ((new Date().getTime() - sdf.parse(stagingCreateTime).getTime()) > overdueTime ) {
                        if( list.get(i).getLastNoCollDate()== null ||
                                ( list.get(i).getLastNoCollDate()!= null
                                        && (new Date().getTime() - sdf.parse( sdf.format(list.get(i).getLastNoCollDate())).getTime()) > overdueTime ) ){  // 如果昨天报了无医废录入时间也不报警
                            exin++;
                        }
                    }
                }
            }
            //   ============================    结束



            // 第二种情况：未开启超期未录入的不预警；
            // 开启的，从最后一次收集时间取到天算起，超过设置的超期未录入预警小时加24的报异常；暂存点未录入过医废不进行超期未录入预警
            if (!StringUtils.isEmpty(list.get(i).getOverdueNotinputSwitch()) && list.get(i).getOverdueNotinputHours() != null
                    && list.get(i).getOverdueNotinputSwitch().equals("0")) {   // 0 开启预警
                if (list.get(i).getLastCollDate() != null) {    // 有最后一次收集时间才比较，没有收集不预警
                    // 处理最后一次收集时间取到天转成long型
                    String lastCollDate = sdf.format(list.get(i).getLastCollDate());
                    if ((new Date().getTime() - sdf.parse(lastCollDate).getTime()) > (3600000L * (list.get(i).getOverdueNotinputHours() + 24))) {
                        exin++;
                    }
                }
            }

            // 收集医废24小时未入库
            if (list.get(i).getNoInCodeIdCount() != null && list.get(i).getNoInCodeIdCount() > 0
                    && list.get(i).getNoInBag() != null && list.get(i).getNoInBag() > 0) {
            }
            // 已入库医废超过48小时未出库
            if (list.get(i).getNoOutCodeIdCount() != null && list.get(i).getNoOutCodeIdCount() > 0
                    && list.get(i).getNoOutBag() != null && list.get(i).getNoOutBag() > 0) {
                exout++;
            }
        }

        System.out.println(" 超出预警值数量：  " + exmaxstore + "  超期未录入数量： " + exin
                + "  超期未出库数量： " + exout);

        Report report1 = new Report();
        report1.setName("超出预警值");
        report1.setValue(exmaxstore);
        zlist.add(report1);
        Report report2 = new Report();
        report2.setName("超期未录入");
        report2.setValue(exin);
        zlist.add(report2);
        Report report3 = new Report();
        report3.setName("超期未出库");
        report3.setValue(exout);
        zlist.add(report3);
        return getDataTable(zlist);
    }


    /**
     * 条形统计图 存积量 预警值
     *
     * @return java.lang.String
     * @author XiaoYi...
     * @date 2020-04-29 18:02
     */
    @GetMapping("/echarets/storageBar")
    public String storage_bar() {
        return prefix + "/echarets/storage_bar";
    }


    /**
     * 条形统计图 存积量 预警值数据
     *
     * @param disId
     * @return
     * a7733e15-331b-4933-8269-7bf68c0bd84e
     */
    @PostMapping("/echarets/storageBarList")
    @JSON(type = Report.class, include = "name,value,warning,disId")
    public TableDataInfo storage_bar(String disId,int limit,int limit2) {
        // disId为空，查询当前用户所在机构的归属地
        Long deptId = null;
        if (StringUtils.isEmpty(disId)) {
            deptId = ShiroUtils.getSysUser().getDeptId();
            disId = String.valueOf(sysDeptService.selectDeptById(deptId).getDistrictsId());
        }

        List<Report> list = null;
        if (disId.length() == 6) {  // 区县级卫健局 显示区县级卫健局下属医院、社区 -- 积存量、预警值
            list = yfReportsService.countyStorageBar(disId,limit2);
        } else {  // 市卫健委及以上
            list = yfReportsService.storage_bar(disId,limit);
        }
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println( "   -----   name：  " + list.get(i).getName() + "  value：  " + list.get(i).getValue()
//                    + "  warning：  " + list.get(i).getWarning()  + "  disId：  " + list.get(i).getDisId()  );
//        }
        return getDataTable(list);
    }


    /**
     * 条形统计图 各区域医疗机构数量
     *
     * @param disId
     * @return
     * fba32984-37ed-4f0e-8d46-4698e817c678
     */
    @PostMapping("/echarets/hospitalNumBarList")
    @JSON(type = Report.class, include = "disId,name,value")
    public TableDataInfo hospitalNumBarList(String disId,int limit) {
        // disId为空，查询当前用户所在机构的归属地
        if (StringUtils.isEmpty(disId)) {
            Long deptId = ShiroUtils.getSysUser().getDeptId();
            disId = String.valueOf(sysDeptService.selectDeptById(deptId).getDistrictsId());
        }
        // disId = 0 乐树汇泉    disId 2位  省     4位 市     6位 区县
        String hospitalTypeIds = "";
        if (disId.length() <= 2) {   // 省级以上    220 省级医院  270 市级医院    290 区县级医院  310 社区
            hospitalTypeIds = "0";
        } else if (disId.length() == 4) {    // 市级 , 不包括省级医院
            hospitalTypeIds = "1";
        } else {     // 区县级，不包括市级医院
            hospitalTypeIds = "2";
        }

        List<Report> list = null;
        if (disId.length() == 6) {  // 区县级卫健局 显示医院数量、暂存点数量
            Report report = yfReportsService.CountyHospitalNumBarList(disId);
            Report report1 = new Report();
            report1.setDisId("0000000000");
            report1.setName("医疗机构");
            report1.setValue(report.getI1());
            Report report2 = new Report();
            report2.setDisId("0000000000");
            report2.setName("暂存点");
            report2.setValue(report.getI2());
            list = new ArrayList<>();
            list.add(report1);
            list.add(report2);
        } else {
            list = yfReportsService.hospitalNumBarList(disId, hospitalTypeIds,limit);
        }

//        for (int i = 0; i < list.size(); i++) {
//            System.out.println( "   --医疗机构数量--   name：  " + list.get(i).getName() + "  value：  " + list.get(i).getValue()
//                    + "  disId：  " + list.get(i).getDisId()  );
//        }
        return getDataTable(list);
    }


    /**
     * 医废类型统计
     *
     * @return java.lang.String
     * @author XiaoYi...
     * @date 2020-04-29 18:02
     * abba64f6-1fe5-45f0-a08c-f8f4d8de55c5
     */
    @GetMapping("/echarets/trashType_pie_statistical")
    public String trashType_pie_statistical() {
        return prefix + "/echarets/trashType_pie_statistical";
    }


    /**
     * 异常类型占比分析图
     * be4c8063-565a-4a30-a986-e661f76cef86
     */
    @GetMapping("/echarets/exception_pie")
    public String exception_pie() {
        return prefix + "/echarets/exception_pie";
    }

    /**
     * @return
     * @author XiaoYi...
     * 累计科室医废 产量、暂存量
     * @date 2020/5/8 14:26
     * 5537def7-3291-444a-b5f8-72b779d6167e
     */
    @PostMapping("/echarets/dept_trash_sum_staging")
    @JSON(type = Report.class, include = "l1,name,d1,i1,d2,i2,d3,i3,d4,i4")
    public TableDataInfo dept_trash_sum_staging(@RequestParam Long deptId) {
        Long udeptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.dept_trash_sum_staging(deptId != null ? deptId : udeptId);
        return getDataTable(list);
    }

    /**
     * @return
     * @author XiaoYi...
     * 累计医废类型 产量、暂存量
     * @date 2020/5/8 14:27
     * ac6973f5-d4eb-4416-889f-14af2764dd45
     */
    @PostMapping("/echarets/trash_type_sum_staging")
    @JSON(type = Report.class, include = "s1,name,d1,l1,d2,l3")
    public TableDataInfo trash_type_sum_staging(@RequestParam Long deptId) {
        Long udeptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.trash_type_sum_staging(deptId != null ? deptId : udeptId);
        return getDataTable(list);
    }

    /**
     * @return
     * @author XiaoYi...
     * 当天科室医废 产量、暂存量
     * @date 2020/5/8 14:27
     * a53ac28c-8204-4fcf-99e1-935e64d889ad
     */
    @PostMapping("/echarets/now_day_dept_trash_sum_staging")
    @JSON(type = Report.class, include = "s1,name,d1,l1,d2,l3")
    public TableDataInfo now_day_dept_trash_sum_staging(@RequestParam Long deptId) {
        System.out.println("传输：" + deptId);
        SysUser user = ShiroUtils.getSysUser();
        Long udeptId = user.getDeptId();
        List<Report> list = yfReportsService.now_day_dept_trash_sum_staging(deptId != null ? deptId : udeptId);
        return getDataTable(list);
    }

    /**
     * @return
     * @author XiaoYi...
     * 当天医废类型 产量、暂存量
     * @date 2020/5/8 14:27
     * 8467c8b6-d8e7-41de-8ef7-70d9156f9456
     */
    @PostMapping("/echarets/now_day_trash_type_sum_staging")
    @JSON(type = Report.class, include = "s1,name,d1,l1,d2,l3")
    public TableDataInfo now_day_trash_type_sum_staging(@RequestParam Long deptId) {
        Long udeptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.now_day_trash_type_sum_staging(deptId != null ? deptId : udeptId);
        return getDataTable(list);
    }

    /**
     * @return
     * @author XiaoYi...
     * 累计、日、待入库数量统计
     * @date 2020/5/11 11:46
     * f09dade2-0191-433d-b8e4-9b428294cc42
     */
    @PostMapping("/echarets/hospital_bag_and_weight")
    @JSON(type = Report.class, include = "id,name,d1,l1,d2,l3,d3,d4,l4,l5")
    public AjaxResult bagandweight(@RequestParam Long deptId) {
        System.out.println("deptId:" + deptId);
        Long udeptId = ShiroUtils.getSysUser().getDeptId();
        Report report = yfReportsService.bagandweight(deptId != null ? deptId : udeptId);
        if (report != null) {
            return AjaxResult.successful(report);
        }
        return error();
    }

    /**
     * @return
     * @author XiaoYi...
     * 收集员周统计产量
     * @date 2020/5/12 10:30
     * 436fe13f-2e47-4460-aa50-51d5128e0468
     */
    @PostMapping("/echarets/gathering_week_of_statistics")
    @JSON(type = Report.class, include = "id,s1,name,sum,count,d1,d2,d3,d4,d5,d6,d7,i1,i2,i3,i4,i5,i6,i7")
    public TableDataInfo gathering_week_of_statistics(@RequestParam Long deptId) {
        Long udeptId = ShiroUtils.getSysUser().getDeptId();
        List<Report> list = yfReportsService.gathering_week_of_statistics(deptId != null ? deptId : udeptId);
        return getDataTable(list);
    }


    /**
     * @param deptId    科室id
     * @param begindate 开始时间
     * @param enddate   结束时间
     *                  医废类型统计
     * @return com.ruoyi.common.core.page.TableDataInfo
     * @author XiaoYi...
     * @date 2020-04-29 17:59
     * 6e5d9d84-9323-4ec7-babe-e192cbbc3e8d
     */
    @RequestMapping(value = "/echarets/trashType", method = RequestMethod.POST)
    @JSON(type = Report.class, include = "name,value,bag")
    public TableDataInfo trashType(Long deptId, String begindate, String enddate) {
        System.out.println(deptId + "," + begindate + "," + enddate);
        List<Report> list = yfReportsService.trashType(deptId, begindate, enddate);
        return getDataTable(list);
    }


    /**
     * 大屏 -- 左一 -- 医废种类饼状图
     * a262cbf1-97fa-4f52-9ed6-ee8346d04e47
     */
    @RequestMapping(value = "/echarets/trashTypeStatistics", method = RequestMethod.POST)
    @JSON(type = Report.class, include = "name,value,bag")
    public TableDataInfo trashTypeStatistics() {
        List<Report> list = yfReportsService.trashTypeStatistics(ShiroUtils.getSysUser().getDeptId());
        return getDataTable(list);
    }


    //todo 报表分析--------------------------
    //6ca32c25-e73d-4fde-9b67-31b83e1ba6a1
    @GetMapping("/cityTrashTypeAll")
    /**
     * 医废类型 统计页面
     * @author XiaoYi...
     * @date 2020-04-29 18:03 
     * @return java.lang.String
     */
    public String cityTrashTypeAll(ModelMap mmap) {
        Integer districtsId = ShiroUtils.getSysUser().getDept().getDistrictsId();
        String deptType = ShiroUtils.getSysUser().getDept().getDeptType();
        mmap.put("deptType", deptType);
        mmap.put("districtsId", districtsId);
        return prefix + "/cityTrashTypeAll";
    }

    /**
     * 省市区县向下钻取 查询医废统计列表
     *
     * @return
     * ddf4c650-fed4-4c74-8b2c-18abc4a528b7
     */
    @PostMapping("/trashTypeAll/list")
    @ResponseBody
    public TableDataInfo cityTrashTypeAll(Long disId, String startDate, String endDate) {

        System.out.println(disId);
        System.out.println(startDate);
        System.out.println(endDate);
        List<Report> list = null;
        if ((disId + "").length() == 6) {  // 区县级卫健局 -- 显示区县级卫健局下辖医院  -- 各医废类型
            list = yfReportsService.countyTrashTypeAll(disId, startDate, endDate);
        } else {  // 市卫健委及以上
            list = yfReportsService.cityTrashTypeAll(disId, startDate, endDate);
        }
        return getDataTable(list);
    }


    /**
     * 报表统计页面
     *
     * @return
     * @author XiaoYi...
     * @date 2020/5/25 10:46
     * 70e9d85d-c372-4f8d-a711-0c6d33bba1fb
     */
    @GetMapping("/statistical")
    public String statisticalView(ModelMap mmap) {
        Integer districtsId = ShiroUtils.getSysUser().getDept().getDistrictsId();
        String deptType = ShiroUtils.getSysUser().getDept().getDeptType();
        mmap.put("deptType", deptType);
        mmap.put("districtsId", districtsId);
        return prefix + "/statistical";
    }

    /**
     * 省市区县向下钻取 统计查询列表
     *
     * @return
     * @author XiaoYi...
     * @date 2020/5/25 10:46
     * 116a0ab5-3ec3-4042-a538-25b6c42b9600
     */
    @PostMapping("/statistical/list")
    @ResponseBody
    public TableDataInfo statistical(Long disId, String startDate, String endDate) {

        List<Report> list = null;
        if ((disId + "").length() == 6) {  // 区县级卫健局 -- 显示区县级卫健局下辖医院  -- 产生量、转运量、暂存量
            list = yfReportsService.countyStatistical(disId, startDate, endDate);
        } else {  // 市卫健委及以上
            list = yfReportsService.cityStatistical(disId, startDate, endDate);
        }
        return getDataTable(list);
    }


    // 省市区县医废向下钻取 -- 按医疗机构统计医废
    @PostMapping("/statistical/getStatisticalWithHospital")
    @ResponseBody
    public TableDataInfo getStatisticalWithHospital(Long disId, String startDate, String endDate) {
        System.out.println("   ------ 地区id：" + disId + "   ----- 开始时间：" + startDate + "  ---- 结束时间：" + endDate );
        // 根据地区查找对应的卫健局
        SysDept sysDept = sysDeptService.getWJJDeptBydisId(disId);
        if( sysDept == null || sysDept.getDeptId() == null ){
            return getDataTable(new ArrayList<>());
        }
        List<Report> list = yfReportsService.getStatisticalWithHospital(sysDept.getDeptId(), startDate, endDate);
        if( list == null ){
            return getDataTable(new ArrayList<>());
        }
        return getDataTable(list);
    }


    // 省市区县医废向下钻取 -- 医疗机构下辖机构
    @PostMapping("/statistical/getHospitalManagerHospital")
    @ResponseBody
    public TableDataInfo getHospitalManagerHospital(Long disId, String startDate, String endDate) {
        System.out.println("   ------ 地区id：" + disId + "   ----- 开始时间：" + startDate + "  ---- 结束时间：" + endDate );
        // 根据地区查找对应的卫健局
        SysDept sysDept = sysDeptService.getWJJDeptBydisId(disId);
        if( sysDept == null || sysDept.getDeptId() == null ){
            return getDataTable(new ArrayList<>());
        }
        List<Report> list = yfReportsService.getHospitalManagerHospital(sysDept.getDeptId(), startDate, endDate);
        if( list == null ){
            return getDataTable(new ArrayList<>());
        }
        return getDataTable(list);
    }


}
